<?php
/* [DoYouHaoBaby!] (C)Dianniu From 2010.
   Gtk文件对话框($)*/

!defined('DYHB_PATH') && exit;

class GtkIoDialog extends DGtkDialog{

	private $_sSelectedPath;
	private $_arrAllSelectedPath;
	private $_bOverwriteConConfirmation=true;
	static private $_sGlabalDefaultDirectory=null;

	public function __construct($nAction=Gtk::FILE_CHOOSER_ACTION_OPEN,$sTitle=null){
		if($sTitle===null){
			$sTitle=G::L('DoYouHaoBaby 文件系统选择窗口','gtk');
		}
		A::INT( $nAction);
		A::STRING( $sTitle);
		$wndDlg=new GtkFileChooserDialog($nAction);// 创建主窗口
		$wndDlg->set_modal(true);
		$wndDlg->set_action($nAction);
		$wndBtnOk=$wndDlg->add_button(G::L('确定','gtk'),Gtk::RESPONSE_OK);
		$wndDlg->add_button(G::L('取消','gtk'),Gtk::RESPONSE_CANCEL);
		$wndDlg->set_title($sTitle);
		$sDefaultDirectory=self::getGlabalDefaultDirectory();
		if($sDefaultDirectory!==null){// 使用全局默认路径
			$wndDlg->set_current_folder($sDefaultDirectory);
		}
		$wndDlg->set_skip_pager_hint(true);// 取消独立窗口
		$wndDlg->set_skip_taskbar_hint(true);
		$wndDlg->connect('response', array($this,'onResponse'));// 事件
		$wndBtnOk->connect('clicked', array($this,'onOk'));
		$this->setWidget($wndDlg);
	}

	static public function choose($nAction=Gtk::FILE_CHOOSER_ACTION_OPEN,$sDefaultPath=null, $sFilterString=null,$bMultiple=false,$sTitle=null){
		if($sTitle===null){
			$sTitle=G::L('DoYouHaoBaby 文件系统选择窗口','gtk');
		}
		$oDlg=new self($nAction,$sTitle);// 创建对话框
		$wndDlg=$oDlg->getWidget();
		if($sDefaultPath){// 预设路径
			if(is_file($sDefaultPath)){// 预设 文件
				$wndDlg->set_filename($sDefaultPath);
			}
			else{
				$wndDlg->set_current_folder($sDefaultPath);// 预设 目录
			}
		}
		if($sFilterString!==null){// 过滤器 字串
			self::useFilterString($wndDlg,$sFilterString);
		}
		if(in_array($nAction,array(Gtk::FILE_CHOOSER_ACTION_SAVE,Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER))){// 多选 保存文件 或 创建目录  只能单选
			$bUseMultiple=false;
		}
		else{
			$bUseMultiple =&$bMultiple;
		}
		$wndDlg->set_select_multiple($bUseMultiple);// 多选
		if($oDlg->doDialog()== Gtk::RESPONSE_CANCEL){
			return null;
		}
		if($bMultiple){// 返回多项(array)
			$arrRet=$oDlg->getAllSelectedPath();
			return(!$arrRet or !count($arrRet))?null:$arrRet;
		}
		else{// 返回单项(string)
			$sPath=$oDlg->getSelectedPath();
			return($sPath)?$sPath:null;
		}
	}

	public function setDefaultName($sDefaultName){
		$wndDialog=$this->getWidget();
		$wndDialog->set_current_name($sDefaultName);
	}

	static public function useFilterString(GtkFileChooserDialog $wndDlg, $sFilterString){
		A::STRING($sFilterString);
		$sString=trim($sFilterString);
		$sString=str_replace("\r",'',$sString);
		if(empty($sString)){
			return;
		}
		$arrLines=explode("\n",$sString);
		foreach($arrLines as $sLine){
			list($sName,$sFilters)= explode("\t",$sLine);
			$arrFilters=explode('|',$sFilters);
			$oFilter=new GtkFileFilter();// 过滤器
			foreach($arrFilters as $sPattern){// 模板
				$oFilter->add_pattern($sPattern);
			}
			$oFilter->set_name($sName);// 过滤器名称
			$wndDlg->add_filter($oFilter);
		}

	}

	public function onOk(GtkButton $wndButton=null){
		if($wndButton===null){// 正常响应 OnResponse
			$this->_bEmitOnOkbyResponse=true;
		}
		if($wndButton and @$this->_bEmitOnOkbyResponse){// 不是响应 onResponse，直接响应 Ok Button ，在 选择目录， 且没有选中 任何目录情况下，点击 Ok Button， Gtk 不会触发 对话框的 onResponse，但是我们仍然希望能够 使用当前打开的目录。
			$this->_bEmitOnOkbyResponse=false;
			return false;
		}
		$wndMainWidget=$this->getWidget();
		A::INSTANCE($wndMainWidget,'GtkDialog',G::L('尚未初始化主窗体。','gtk'));
		$nAction=$wndMainWidget->get_action();
		switch($nAction){
			case Gtk::FILE_CHOOSER_ACTION_OPEN :// 打开文件
				$arrFileDirs=$wndMainWidget->get_filenames();
				if(count($arrFileDirs)){// 选中 一个 即可
					$this->_sSelectedPath=$wndMainWidget->get_filename();
					$this->_arrAllSelectedPath=$arrFileDirs;
				}
				else{// 未选中任何内容
					print "no file be selected\r\n";
					return false;
				}
				break;
			case Gtk::FILE_CHOOSER_ACTION_SAVE :// 保存文件
				if(!$sFile=$wndMainWidget->get_filename()){// 未选中任何内容
					return false;
				}
				if(is_file($sFile)and $this->getOverwriteConfirmation()){// 提示覆盖
					$nRes=DGtk::messageDialog(
							G::L("文件已经存在，是否覆盖此文件？%s",'gtk',null,$sFile),
							G::L('如何处理已经存在的文件？','gtk',null),
							Gtk::MESSAGE_QUESTION,
							Gtk::BUTTONS_YES_NO
					);
					if(Gtk::RESPONSE_NO == $nRes){
						return false;
					}
				}
				$this->_sSelectedPath=$wndMainWidget->get_filename();
				$this->_arrAllSelectedPath=$wndMainWidget->get_filenames();
				break;
			case Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER :// 打开文件夹
				$arrSelectedDirs=array();// 所有选中 的 内容
				$arrFileOrDirs=$wndMainWidget->get_filenames();
				foreach($arrFileOrDirs as $sFileOrDirPath){
					if(is_dir($sFileOrDirPath)){
						$arrSelectedDirs[]=$sFileOrDirPath;
					}
				}
				if(!count($arrSelectedDirs)){// 没有选择任何目录，当使用前打开的目录
					$this->_sSelectedPath=$wndMainWidget->get_current_folder();
					$this->_arrAllSelectedPath=array($this->_sSelectedPath);
				}
				else {
					$this->_arrAllSelectedPath=$arrSelectedDirs;// 多选
					$sSelectedPath=$wndMainWidget->get_filename();// 选中
					$this->_sSelectedPath=is_dir($sSelectedPath)? $sSelectedPath: array_shift($arrSelectedDirs);
				}
				break;
			default :
				break;
		}
		self::setGlabalDefaultDirectory($this->_sSelectedPath);
		return parent::onOk();
	}

	public function addFilter($Pattern,$sName=null,$bDefault=false){
		A::ISTHESE($Pattern,array('string','array:string'));
		A::ISTHESE($sName,array('string','null'));
		if(is_string($Pattern)){
			$arrPattern=array($Pattern);
		}
		else if(is_array($Pattern)){
			$arrPattern =& $Pattern;
		}
		$wndMainWidget=$this->getWidget();
		A::INSTANCE($wndMainWidget,'GtkDialog',G::L('尚未初始化主窗体。','gtk',null));
		$oFilter=new GtkFileFilter();// 过滤器
		foreach($arrPattern as $sPattern){
			$oFilter->add_pattern($sPattern);
		}
		if($sName===null){// 名称
			$sName=implode(' | ',$arrPattern);
		}
		$oFilter->set_name($sName);
		$wndMainWidget->add_filter($oFilter);
		if($bDefault){// 默认
			$wndMainWidget->set_filter($oFilter);
		}
	}

	public function getSelectedPath(){
		return $this->_sSelectedPath;
	}

	public function getAllSelectedPath(){
		return $this->_arrAllSelectedPath;
	}

	public function setOverwriteConfirmation($bOverwriteConConfirmation){
		$this->_bOverwriteConConfirmation=$bOverwriteConConfirmation?true:false;
	}

	public function getOverwriteConfirmation(){
		return $this->_bOverwriteConConfirmation;
	}

	static public function getGlabalDefaultDirectory(){
		return self::$_sGlabalDefaultDirectory;
	}

	static public function setGlabalDefaultDirectory($sPath){
		if($sPath===null){
			$sDirectory=null;
		}
		else {
			if(is_dir($sPath)){
				$sDirectory=$sPath;
			}
			else{
				$sDirectory=dirname($sPath);
			}
			A::DDIR($sDirectory,G::L('参数 $sPath(“%s”)必须为存在的路径','gtk',null,$sPath));
			$sDirectory=G::tidyPath($sDirectory);
		}
		$sOldValue=self::$_sGlabalDefaultDirectory;
		self::$_sGlabalDefaultDirectory=$sDirectory;
		return $sOldValue;
	}

}
